package org.algorithm.string;
/**
 * 两个Deciamal字符串相加，要求不能转换为整数，返回值还是字符串
 *
 * 思路：
 * 1、如果两个字符串长度不同，那么长度小的用0来补齐高位
 * 2、用%10来放当前位，/10来补齐上一位
 */
public class AddDecimalStrings {
    public static String addDecimalStrings(String num1, String num2) {
        StringBuilder result = new StringBuilder();
        // 分割整数部分和小数部分
        String[] parts1 = num1.split("\\.");
        String[] parts2 = num2.split("\\.");

        // 补齐小数部分，使两个小数部分位数相同
        if(parts1.length==1){
            parts1= new String[]{parts1[0],"0"};
        }
        if(parts2.length==1){
            parts2= new String[]{parts2[0],"0"};
        }
        // 将小数部分转换为等长的字符串
        String decimal1 = padDecimal(parts1[1],Math.max(parts1[1].length(),parts2[1].length()));
        String decimal2 = padDecimal(parts2[1],Math.max(parts1[1].length(),parts2[1].length()));
        // 从小数点后的最低位到最高位逐位相加
        int carry = 0;
        for (int i = decimal1.length()-1; i >=0 ; i--) {
            int digit1= decimal1.charAt(i)-'0';
            int digit2= decimal2.charAt(i)-'0';
            int sum = digit1+digit2+carry;
            result.insert(0,sum%10);
            carry=sum/10;
        }
        // 添加小数点
        result.insert(result.length()-parts1[1].length(),".");
        // 添加整数部分
        result.insert(0,addStrings(parts1[0],parts2[0]));
        return result.toString();
    }
    // 辅助方法，将小数部分补齐到指定长度
    private static String padDecimal(String decimalStr,int targetLength){
        StringBuilder paddedDecimal = new StringBuilder(decimalStr);
        while (paddedDecimal.length()<targetLength){
            paddedDecimal.append('0');
        }
        return paddedDecimal.toString();
    }
    // 辅助方法，两个整数字符串相加
    private static String addStrings(String num1, String num2){
        StringBuilder result = new StringBuilder();
        int i = num1.length()-1;
        int j= num2.length()-1;
        int carry =0;
        while (i>=0|| j>=0||carry!=0){
            int digit1= (i>=0) ? num1.charAt(i)-'0':0;
            int digit2= (j>=0) ? num2.charAt(j)-'0':0;
            int sum = digit1+digit2+carry;
            result.insert(0,sum%10);
            carry=sum/10;
            i--;
            j--;
        }
        return result.toString();
    }

    public static void main(String[] args) {
        String num1 = "123456789012345678901234567890.456";
        String num2 = "10.44";

        String sum = addDecimalStrings(num1, num2);
        System.out.println(num1 + " + " + num2 + " = " + sum);
    }
}
